package tech.wetech.admin3.util;

import io.jsonwebtoken.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.UUID;

@Slf4j
@Component
public class AooJwtUtil {
  // 静态字段-静态方法访问，通过类直接访问；
  // 非静态字段，非静态方法访问，非静态方法需要创建实例才能调用。
  // @Value不能直接用于静态变量,因为Spring首先实例化类，然后注入非静态字段.静态字段在类加载时就已经初始化，此时Spring尚未开始注入过程
  @Value("${SECRET_KEY}")
  private String SECRET_KEY;
  static final long EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 7; // token 有效期（7天）

  public String generateToken(String email, Integer status, String role) {
    JwtBuilder jwtBuilder = Jwts.builder();
    String token = jwtBuilder
      //header
      .setHeaderParam("typ", "JWT")
      .setHeaderParam("alg", "HS256")
      //payload
      .claim("email", email)
      .claim("status", status) // 标记是否已验证
      .claim("role", role)
      .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
      .setId(UUID.randomUUID().toString())
      //signature
      .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
      .compact();
    log.info("邮箱登录 SECRET_KEY--  {}", SECRET_KEY);
    log.info("邮箱登录 token--  {}", token);

    return token;
  }

  public String generateTokenWx(String unionid) {
    String token = Jwts.builder()
      .setSubject(unionid) // 将 unionid 设置为 token 的主题
//      .claim("sessionKey", sessionKey) // 将 sessionKey 作为一个自定义的声明添加到 token 中
      .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置 token 的过期时间
      .signWith(SignatureAlgorithm.HS256, SECRET_KEY) // 使用 HS256 算法和你的密钥来签名 token
      .compact(); // 将 token 压缩到一个字符串中
    return token;
  }

  // 封装验证token是否过期的方法
  public boolean verifyToken(String token) {
    if (token == null || token.isEmpty()) {
      return false; // 过期
    }
    // 根据token验证用户身份
    try {
      Jws<Claims> claimsJws =
        Jwts.parser()
          .setSigningKey(SECRET_KEY) // 设置用于验证签名的密钥
          .parseClaimsJws(token); // 解析 token
      // 解析声明claim claimsJws.getBody().get("email")可获取邮箱
      // log.info("claimsJws.getBody().get(\"email\")  {}", claimsJws.getBody().get("email"));
      return true; // 如果解析成功，那么 token 是有效的
    } catch (Exception e) {
      // 如果解析失败，那么 token 是无效的
      return false;
    }
  }

  public Jws<Claims> parseToken(String token) {
    return
      Jwts.parser()
        .setSigningKey(SECRET_KEY) // 设置用于验证签名的密钥
        .parseClaimsJws(token); // 解析 token
  }
//    log.info("claimsJws.getBody().get(\"sessionKey\")  {}", claimsJws.getBody().get("sessionKey"));
//    log.info("claimsJws.getBody().getSubject(: {}", claimsJws.getBody().getSubject());
}


